// 适配器模式 Adapter Pattern
// 应用实例:1、美国电器 110V，中国 220V，就要有一个适配器将 110V 转化为 220V。
// 优点： 1、可以让任何两个没有关联的类一起运行。 2、提高了类的复用。 3、增加了类的透明度。 4、灵活性好。

// 缺点： 1、过多地使用适配器，会让系统非常零乱，不易整体进行把握。比如，明明看到调用的是 A 接口，其实内部被适配成了 B 接口的实现，一个系统如果太多出现这种情况，无异于一场灾难。因此如果不是很有必要，可以不使用适配器，而是直接对系统进行重构。

// 实现:
// 1 媒体播放器和更高的媒体播放器创建接口

interface MediaPlayer {
    play(audioType: string, fileName: string): void;
}

interface AdvanceMdeiPlayer {
    playVlc(fileName: string): void;
    playMp4(fileName: string): void;
}

// 步骤2,  AdvancedMediaPlayer 接口的实体类(处理器)
class VlcPlayer implements AdvanceMdeiPlayer {
    playVlc(fileName: string): void {
        console.log(`播放vlc, 文件名${fileName}`);
    }

    playMp4(fileName: string): void {

    }
}

class Mp4Player implements AdvanceMdeiPlayer {
    playVlc(fileName: string): void {
    }

    playMp4(fileName: string): void {
        console.log(`播放mp4, 文件名${fileName}`);
    }
}

// 步骤3 创建实现了MediaPlay接口的适配器类
class MediaAdapter implements MediaPlayer {
    advanceMusicPlayer: AdvanceMdeiPlayer;
    constructor(audioType: string) {
        if (audioType === 'vlc') {
            this.advanceMusicPlayer = new VlcPlayer();
        } else {
            this.advanceMusicPlayer = new Mp4Player();
        }
    }

    play(audioType: string, fileName: string): void {
        if (audioType === 'vlc') {
            this.advanceMusicPlayer.playVlc(fileName);
        } else if (audioType === 'mp4') {
            this.advanceMusicPlayer.playMp4(fileName);
        } else {
            console.log("无法播放");
        }
    }
}

// 创建实现了 MediaPlayer 接口的实体类。
// 此处封装一下, 可以在使用的时候减少 new MediaAdapter
class AudioPlayer implements MediaPlayer {
    play(audioType: string, fileName: string): void {
        if (audioType === 'mp3') {
            console.log("播放mp3");
        } else if (audioType === 'vlc' || audioType === 'mp4') {
            let mediaAdapter = new MediaAdapter(audioType);
            mediaAdapter.play(audioType, fileName);
        } else {
            console.log("无法播放本文件");
        }
    }
}


let audioPlayer = new AudioPlayer();
audioPlayer.play("mp3", "beyond the horizon.mp3");
audioPlayer.play("mp4", "alone.mp4");
audioPlayer.play("vlc", "far far away.vlc");
audioPlayer.play("avi", "mind me.avi");